#!/bin/bash

# 定义变量
INSTALL_DIR="/opt/nps"            # 安装目录
CONFIG_FILE="$INSTALL_DIR/npc.conf"  # 配置文件路径
SERVICE_NAME="npc"                # 服务名称
SCRIPT_NAME="NPS"                # 脚本命令名称
SCRIPT_INSTALL_DIR="/usr/local/bin"  # 脚本安装目录

# 检查是否以root用户运行
if [ "$EUID" -ne 0 ]; then
  echo "请以root用户运行此脚本"
  exit 1
fi

# 获取系统架构
ARCH=$(uname -m)
case $ARCH in
  x86_64)
    ARCH="amd64"
    ;;
  aarch64)
    ARCH="arm64"
    ;;
  armv7l)
    ARCH="arm"
    ;;
  *)
    echo "不支持的架构: $ARCH"
    exit 1
    ;;
esac

# 获取最新版本
function get_latest_version() {
  LATEST_VERSION=$(curl -s https://api.github.com/repos/djylb/nps/releases/latest | grep -oP '"tag_name": "\K(.*)(?=")')
  if [ -z "$LATEST_VERSION" ]; then
    echo "无法获取最新版本，请检查网络连接"
    exit 1
  fi
  echo "$LATEST_VERSION"
}

# 安装NPS客户端
function install_npc() {
  LATEST_VERSION=$(get_latest_version)
  echo "正在下载NPS客户端（版本: $LATEST_VERSION, 架构: $ARCH）..."

  # 确保安装目录存在
  mkdir -p "$INSTALL_DIR"

  DOWNLOAD_URL="https://github.com/djylb/nps/releases/download/$LATEST_VERSION/linux_${ARCH}_client.tar.gz"
  echo "下载链接: $DOWNLOAD_URL"

  # 下载文件
  wget -q "$DOWNLOAD_URL" -O "$INSTALL_DIR/npc.tar.gz"
  if [ $? -ne 0 ]; then
    echo "下载失败，请检查网络连接或下载链接是否正确"
    exit 1
  fi

  # 解压文件
  echo "正在解压文件..."
  mkdir -p /tmp/npc_temp
  tar -zxvf "$INSTALL_DIR/npc.tar.gz" -C /tmp/npc_temp

  # 检查文件结构并移动 npc 文件
  if [ -f "/tmp/npc_temp/bin/npc" ]; then
    mv /tmp/npc_temp/bin/npc "$INSTALL_DIR/"
  elif [ -f "/tmp/npc_temp/npc" ]; then
    mv /tmp/npc_temp/npc "$INSTALL_DIR/"
  else
    echo "解压后未找到 npc 文件，请检查压缩包内容"
    exit 1
  fi
  rm -rf /tmp/npc_temp
  rm -f "$INSTALL_DIR/npc.tar.gz"

  # 检查文件
  if [ ! -f "$INSTALL_DIR/npc" ]; then
    echo "解压后未找到 npc 文件，请检查压缩包内容"
    exit 1
  fi

  echo "NPS客户端安装完成！"
}

# 初始化配置文件
function init_config() {
  while true; do
    read -p "请输入NPS服务器地址和端口（例如 127.0.0.1:8024）: " NPS_SERVER
    if [ -z "$NPS_SERVER" ]; then
      echo "输入不能为空，请重新输入！"
    else
      break
    fi
  done

  while true; do
    read -p "请输入连接类型（默认 tcp）: " CONN_TYPE
    CONN_TYPE=${CONN_TYPE:-tcp}  # 如果用户未输入，则使用默认值 tcp
    if [ -z "$CONN_TYPE" ]; then
      echo "输入不能为空，请重新输入！"
    else
      break
    fi
  done

  while true; do
    read -p "请输入客户端密钥: " NPS_VKEY
    if [ -z "$NPS_VKEY" ]; then
      echo "输入不能为空，请重新输入！"
    else
      break
    fi
  done

  # 写入配置文件
  cat <<EOF > "$CONFIG_FILE"
[common]
server_addr=$NPS_SERVER
conn_type=$CONN_TYPE
vkey=$NPS_VKEY
EOF

  echo "配置文件已初始化: $CONFIG_FILE"
}

# 创建Systemd服务文件
function create_service_file() {
  echo "正在创建Systemd服务文件..."
  cat <<EOF | sudo tee /etc/systemd/system/$SERVICE_NAME.service > /dev/null
[Unit]
Description=NPS Client (npc)
After=network.target

[Service]
Type=simple
ExecStart=$INSTALL_DIR/npc -config=$CONFIG_FILE
Restart=always
RestartSec=3
User=nobody
Group=nogroup

[Install]
WantedBy=multi-user.target
EOF

  # 设置文件权限
  chmod 644 /etc/systemd/system/$SERVICE_NAME.service

  # 重载Systemd配置
  systemctl daemon-reload
}

# 启动服务并检查状态
function start_service() {
  echo "正在启动 NPS 客户端服务..."
  systemctl start "$SERVICE_NAME"
  if [ $? -ne 0 ]; then
    echo "服务启动失败，请检查日志"
    journalctl -u "$SERVICE_NAME"
    read -p "按 Enter 键返回菜单..."
    return  # 返回菜单
  fi

  echo "正在检查服务状态..."
  TEMP_FILE=$(mktemp)  # 创建一个临时文件
  systemctl status "$SERVICE_NAME" --no-pager > "$TEMP_FILE"
  cat "$TEMP_FILE"  # 显示服务状态
  rm -f "$TEMP_FILE"  # 删除临时文件

  # 检查客户端日志
  echo "正在检查客户端日志..."
  if [ -f "/opt/nps/logs/npc.log" ]; then
    cat /opt/nps/logs/npc.log
  else
    echo "未找到客户端日志文件"
  fi

  read -p "按 Enter 键返回菜单..."
}

# 卸载NPS客户端
function uninstall_npc() {
  echo "正在停止 NPS 客户端服务..."
  systemctl stop "$SERVICE_NAME"
  systemctl disable "$SERVICE_NAME"

  echo "正在删除服务文件..."
  rm -f /etc/systemd/system/"$SERVICE_NAME".service
  systemctl daemon-reload

  echo "正在删除安装目录..."
  rm -rf "$INSTALL_DIR"

  echo "NPS客户端已卸载！"
}

# 显示菜单
function show_menu() {
  echo "请选择要执行的操作："
  echo "1. 安装NPS客户端"
  echo "2. 更改服务器地址"
  echo "3. 更改客户端密钥"
  echo "4. 重启NPS客户端"
  echo "5. 卸载NPS客户端"
  echo "6. 卸载脚本和NPS客户端"
  echo "0. 退出"
}

# 更改服务器地址和端口
function change_server() {
  while true; do
    read -p "请输入新的服务器地址和端口（例如 127.0.0.1:8024）: " NEW_SERVER
    if [ -z "$NEW_SERVER" ]; then
      echo "输入不能为空，请重新输入！"
    else
      break
    fi
  done

  # 更新配置文件
  sed -i "s/^server_addr=.*/server_addr=$NEW_SERVER/" "$CONFIG_FILE"
  echo "服务器地址和端口已更新为: $NEW_SERVER"

  # 重启服务
  systemctl restart "$SERVICE_NAME"
  if [ $? -eq 0 ]; then
    echo "NPS客户端已重启，更改成功！"
  else
    echo "NPS客户端重启失败，请检查日志"
  fi

  read -p "按 Enter 键返回菜单..."
}

# 更改客户端密钥
function change_vkey() {
  while true; do
    read -p "请输入新的客户端密钥: " NEW_VKEY
    if [ -z "$NEW_VKEY" ]; then
      echo "输入不能为空，请重新输入！"
    else
      break
    fi
  done

  # 更新配置文件
  sed -i "s/^vkey=.*/vkey=$NEW_VKEY/" "$CONFIG_FILE"
  echo "客户端密钥已更新为: $NEW_VKEY"

  # 重启服务
  systemctl restart "$SERVICE_NAME"
  if [ $? -eq 0 ]; then
    echo "NPS客户端已重启，更改成功！"
  else
    echo "NPS客户端重启失败，请检查日志"
  fi

  read -p "按 Enter 键返回菜单..."
}

# 重启NPS客户端
function restart_npc() {
  systemctl restart "$SERVICE_NAME"
  if [ $? -eq 0 ]; then
    echo "NPS客户端已重启，操作成功！"
  else
    echo "NPS客户端重启失败，请检查日志"
  fi

  read -p "按 Enter 键返回菜单..."
}

# 安装脚本到系统
function install_script() {
  echo "正在安装脚本到系统..."
  cp "$0" "$SCRIPT_INSTALL_DIR/$SCRIPT_NAME"
  chmod +x "$SCRIPT_INSTALL_DIR/$SCRIPT_NAME"
  echo "脚本已安装，您可以通过命令 '$SCRIPT_NAME' 来运行脚本。"
}

# 卸载脚本和NPS客户端
function uninstall_script_and_npc() {
  echo "正在卸载脚本和NPS客户端..."
  uninstall_npc
  rm -f "$SCRIPT_INSTALL_DIR/$SCRIPT_NAME"
  echo "脚本和NPS客户端已卸载！"
}

# 主循环
function main() {
  while true; do
    show_menu
    read -p "请输入选项（1-6，0 退出）: " OPTION
    case $OPTION in
      1)
        install_npc
        init_config
        create_service_file
        start_service
        systemctl enable "$SERVICE_NAME"
        install_script
        ;;
      2)
        change_server
        ;;
      3)
        change_vkey
        ;;
      4)
        restart_npc
        ;;
      5)
        uninstall_npc
        ;;
      6)
        uninstall_script_and_npc
        ;;
      0)
        echo "退出"
        break
        ;;
      *)
        echo "无效选项，请重新输入"
        ;;
    esac
  done
}

# 如果直接运行脚本，则进入菜单
if [[ "${BASH_SOURCE[0]}" == "${0}" ]]; then
  main
fi